package template_wrapper

import (
	html_template "html/template"
	text_template "text/template"
)

type TemplateParser struct {
	// 模板类型
	TemplateType string
	// 自定义函数
	FuncMap map[string]any
	// 左分隔符
	LeftDelim string
	// 右分隔符
	RightDelim string
}

func NewTemplateParser(templateType string, funcMap map[string]any) *TemplateParser {
	var newParser TemplateParser

	newParser.TemplateType = templateType
	newParser.LeftDelim = LEFT_DELIM_DEFAULT
	newParser.RightDelim = RIGHT_DELIM_DEFAULT

	if funcMap != nil {
		newParser.FuncMap = funcMap
	} else {
		newParser.FuncMap = text_template.FuncMap{}
	}

	return &newParser
}

func NewTemplateParserFromConfig(config *TemplateConfig) *TemplateParser {
	var newParser TemplateParser

	newParser.TemplateType = config.TemplateType
	newParser.LeftDelim = config.LeftDelim
	newParser.RightDelim = config.RightDelim

	if config.FuncMap != nil {
		newParser.FuncMap = config.FuncMap
	} else {
		newParser.FuncMap = text_template.FuncMap{}
	}

	return &newParser
}

// 解析模板
func (_parser TemplateParser) ParseTemplate(name string, content string) TemplateWrapper {
	var newTemplate TemplateWrapper
	templateType := _parser.TemplateType

	if templateType == TEMPLATE_TYPE_TEXT {
		// 创建文本模板
		newTemplate = _parser._NewTextTemplate(name, content)
	} else if templateType == TEMPLATE_TYPE_HTML {
		// 创建 HTML 模板
		newTemplate = _parser._NewHtmTemplate(name, content)
	} else {
		panic("invalid TemplateType(" + templateType + ")")
	}

	return newTemplate
}

// 创建 TEXT 模板对象
func (_parser TemplateParser) _NewTextTemplate(name string, content string) TemplateWrapper {
	var tmpl *text_template.Template
	var err error

	tmpl = text_template.New(name)
	tmpl = tmpl.Funcs(_parser.FuncMap)
	tmpl = tmpl.Delims(_parser.LeftDelim, _parser.RightDelim)
	tmpl, err = tmpl.Parse(content)

	if err != nil {
		panic(err)
	}

	return &TextTemplate{TargetTemplate: tmpl}
}

// 创建 HTML 模板对象
func (_parser TemplateParser) _NewHtmTemplate(name string, content string) TemplateWrapper {
	var tmpl *html_template.Template
	var err error

	tmpl = html_template.New(name)
	tmpl = tmpl.Funcs(_parser.FuncMap)
	tmpl = tmpl.Delims(_parser.LeftDelim, _parser.RightDelim)
	tmpl, err = tmpl.Parse(content)

	if err != nil {
		panic(err)
	}

	return &HtmlTemplate{TargetTemplate: tmpl}
}
